package com.liufei.class03;

import java.util.Comparator;
import java.util.HashMap;
import java.util.TreeMap;

public class Code05_HashMapTreeMap {

    public static class Node {
        public int value;

        public Node(int value) {
            this.value = value;
        }
    }

    // (K, V) 表
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("liufei", "我是刘飞");
        System.out.println(map.containsKey("liufei"));  // true
        System.out.println(map.containsKey("liu"));  // false
        System.out.println(map.get("liufei"));

        map.put("liufei", "他是刘飞");
        System.out.println(map.get("liufei"));

//        map.remove("liufei");
//        System.out.println(map.containsKey("liufei"));
//        System.out.println(map.get("liufei"));

        String test1 = "liufei";
        String test2 = "liufei";
        System.out.println(map.containsKey(test1)); // true
        System.out.println(map.containsKey(test2)); // true

        HashMap<Integer, String> map2 = new HashMap<>();
        map2.put(123456, "我是123456");

        Integer a = 123456;
        Integer b = 123456;

        System.out.println(a == b);  // false
        // 总结对于像 String Integer Float Double ..等类型的数据比较的是值
        System.out.println(map2.containsKey(a));  // true
        System.out.println(map2.containsKey(b));  // true

        System.out.println("=========");
        // 数组
        HashMap<int[], String> map3 = new HashMap<>();
        int[] arr1 = {1, 2, 3};
        int[] arr2 = {1, 2, 3};
        map3.put(arr1, "我是数组1");
        System.out.println(map3.containsKey(arr1)); // true
        System.out.println(map3.containsKey(arr2));  // false

        // 自定义的对象。对象存储的是内存地址，node1和node2是两个对象，内存地址肯定不一样
        // 除非在Node中重新equals()和hascode()方法
        HashMap<Node, String> map4 = new HashMap<>();
        Node node1 = new Node(1);
        Node node2 = new Node(1);
        map4.put(node1, "我是node1");
        System.out.println(map4.containsKey(node1));  // true
        System.out.println(map4.containsKey(node2));  // false

        System.out.println("=======");

        TreeMap<Integer, String> treeMap = new TreeMap<>();
        treeMap.put(3, "我是3");
        treeMap.put(0, "我是0");
        treeMap.put(7, "我是7");
        treeMap.put(2, "我是2");
        treeMap.put(5, "我是5");
        treeMap.put(9, "我是9");

        System.out.println(treeMap.containsKey(7)); // true
        System.out.println(treeMap.containsKey(6)); // false
        System.out.println(treeMap.get(3));   // 我是3

        treeMap.put(3, "他是3");

        System.out.println(treeMap.get(3)); // 他是3

        treeMap.remove(3);
        System.out.println(treeMap.get(3)); // null

        // 其相比较HashMap多了一些常用的方法，因为其key是有序的

        // 返回最小的key
        System.out.println(treeMap.firstKey()); // 0
        // 返回最大的key
        System.out.println(treeMap.lastKey()); // 9
        // 返回 <=5 离5最近的key
        System.out.println(treeMap.floorKey(5)); // 5
        // 返回 <=6 离6最近的key
        System.out.println(treeMap.floorKey(6)); // 5
        // 返回 >=5 离5最近的key
        System.out.println(treeMap.ceilingKey(5)); // 5
        // 返回 >=6 离6最近的key
        System.out.println(treeMap.ceilingKey(6)); // 7

        // 使用下面的treeMap2会报错，这里的key是Node对象，程序并不知道怎么按照Node进行排序
        // TreeMap<Node, String> treeMap2 = new TreeMap<>();

        // 我们可以给出其排序的规则
        TreeMap<Node, String> treeMap2 = new TreeMap<>(new Comparator<Node>() {
            @Override
            public int compare(Node o1, Node o2) {
                // 按照升序排序
                return o1.value - o2.value;
            }
        });

        Node node3 = new Node(3);
        Node node4 = new Node(4);
        treeMap2.put(node4, "我是node4");
        treeMap2.put(node3, "我是node3");

        System.out.println(treeMap2.firstKey().value);  // 3
    }
}
